package tcpVerbindung;

import java.io.IOException;
import java.net.UnknownHostException;

import javax.swing.JOptionPane;

import model.VerwArtikel;

public class VerwaltungTCP {

	private VerwArtikel modVerwArtikel;

	private Thread thEmpfangen;
	private Thread thSenden;

	private String ip = "192.168.1.1";
	// private String ip = "192.168.1.43";
	//private String ip = "127.0.0.1";
	private int port = 2000;

	private java.net.Socket socket;

	private boolean verbindungAufgebaut;

	/**
	 * Konstruktor
	 * 
	 * @param modVerwArtikel
	 */
	public VerwaltungTCP(VerwArtikel modVerwArtikel) {

		this.modVerwArtikel = modVerwArtikel;

		socket = new java.net.Socket();

		thEmpfangen = new Thread(new Runnable() {

			@Override
			public void run() {

				while (true) {

					tcpEmpfangen();

					try {
						Thread.sleep(25);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}
			}
		});

		thSenden = new Thread(new Runnable() {

			@Override
			public void run() {
				for (int i = 0; i < 2;) { // Endlosschlaufe

					senden();

					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		});

		// TCP Verbindung aufbauen
		tcpAufbauen();

	}

	private void tcpAufbauen() {

		try {
			socket = utils.verbindungAufbauen(ip, port);

			verbindungAufgebaut = true;

		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();

			String message = "Es konnte keine Verbindung zur SPS aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung",
					JOptionPane.YES_OPTION);

			verbindungAufgebaut = false;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();

			String message = "Es konnte keine Verbindung zur SPS aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung",
					JOptionPane.YES_OPTION);

			verbindungAufgebaut = false;
		}

		// Nur starten wenn Verbindung OK
		if (verbindungAufgebaut) {
			// Threads starten
			thEmpfangen.start();
			thSenden.start();
		}

	}

	/**
	 * Daten senden
	 * 
	 * @throws IOException
	 */
	private void tcpSenden() {

		try {
			System.out.println("Datenstring: " + modVerwArtikel.datenSenden());

			SendenString.datenSenden(socket, modVerwArtikel.datenSenden());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * Senden
	 */
	private void senden() {
		short[] io = modVerwArtikel.getIO();

		int[] parameter = modVerwArtikel.getParameter();

		try {
			SendenListe.sendenListe(socket, io, parameter);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();

			String message = "Es konnte keine Verbindung zur SPS aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung",
					JOptionPane.YES_OPTION);

			verbindungAufgebaut = false;

			thSenden.stop();
			thEmpfangen.stop();
		}

	}

	/**
	 * Daten Empfangen
	 * 
	 * @throws IOException
	 */
	private void tcpEmpfangen() {

		try {
			modVerwArtikel.datenAuswerten(utils.datenEmpfangen(socket, 250));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();

			String message = "Es konnte keine Verbindung zur SPS aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung",
					JOptionPane.YES_OPTION);

			verbindungAufgebaut = false;

			thSenden.stop();
			thEmpfangen.stop();
		}

	}
}